/**
 * Copyright (c) 2008-2012 FeiLong, Inc. All Rights Reserved.
 * <p>
 * 	This software is the confidential and proprietary information of FeiLong Network Technology, Inc. ("Confidential Information").  <br>
 * 	You shall not disclose such Confidential Information and shall use it 
 *  only in accordance with the terms of the license agreement you entered into with FeiLong.
 * </p>
 * <p>
 * 	FeiLong MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE SOFTWARE, EITHER EXPRESS OR IMPLIED, 
 * 	INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
 * 	PURPOSE, OR NON-INFRINGEMENT. <br> 
 * 	FeiLong SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
 * 	THIS SOFTWARE OR ITS DERIVATIVES.
 * </p>
 */
package com.feilong.commons.core.io;

import java.io.File;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.feilong.commons.core.util.ArrayUtil;

/**
 * 文件操作
 * 
 * @author <a href="mailto:venusdrogon@163.com">金鑫</a>
 * @version 1.0 2012-5-23 下午5:00:54
 */
public final class FileUtil{

	private static final Logger	log	= LoggerFactory.getLogger(FileUtil.class);

	/** Don't let anyone instantiate this class. */
	private FileUtil(){}

	/*********************************************************************/
	/**
	 * 创建文件夹
	 * 
	 * @param folderName
	 *            文件夹名称
	 */
	public static void createDirectory(String folderName){
		// 文件和目录路径名的抽象表示形式
		File folder = new File(folderName);
		if (!folder.exists()){
			folder.mkdir();
		}
	}

	/*********************************************************************/
	/**
	 * 删除某个文件或者文件夹
	 * 
	 * @param fileName
	 *            文件或者文件夹名称
	 */
	public static void deleteFileOrDirectory(String fileName){
		File file = new File(fileName);
		if (file.exists()){
			deleteFileOrDirectory(file);
		}else{
			log.error(fileName + "不存在");
		}
	}

	/**
	 * 删除文件或者文件夹,如果是文件夹 ,递归深层次 删除
	 * 
	 * @param file
	 *            文件或者文件夹名称
	 */
	public static void deleteFileOrDirectory(File file){
		if (file.exists() && file.isDirectory()){
			File[] files = file.listFiles();
			if (null != files && files.length > 0){
				for (File currentFile : files){
					if (!currentFile.isDirectory()){
						currentFile.delete();
					}else{
						deleteFileOrDirectory(currentFile);
					}
				}
			}
			file.delete();
		}else{
			file.delete();
		}
	}

	/**************************************************************************************/
	/**
	 * 使用新的 后缀名称
	 * 
	 * @param fileName
	 *            文件名称
	 * @param newPostfixName
	 *            新的文件名
	 * @return
	 */
	public final static String getNewFileName(String fileName,String newPostfixName){
		// 有后缀
		if (hasPostfixName(fileName)){
			return fileName.substring(0, fileName.lastIndexOf(".") + 1) + newPostfixName;
		}
		// 没有后缀直接拼接
		return fileName + "." + newPostfixName;
	}

	/**
	 * 判断是否有后缀
	 * 
	 * @param fileName
	 * @return
	 */
	public final static boolean hasPostfixName(String fileName){
		fileName = getFileName(fileName);
		int lastIndexOf = fileName.lastIndexOf(".");
		if (-1 == lastIndexOf){
			return false;
		}
		return true;
	}

	/**
	 * 获得文件后缀名,并返回原样字母<br>
	 * 如果文件没有后缀名 返回 ""
	 * 
	 * @param fileName
	 *            文件名称
	 * @return 不带. 的后缀
	 */
	public final static String getFilePostfixName(String fileName){
		if (hasPostfixName(fileName)){
			String filePostfixName = fileName.substring(fileName.lastIndexOf(".") + 1, fileName.length());
			return filePostfixName;
		}
		return "";
	}

	/**
	 * 获得文件后缀名,并返回小写字母<br>
	 * 如果文件没有后缀名 返回 ""
	 * 
	 * @param fileName
	 *            文件名称
	 * @return 不带. 的后缀
	 */
	public final static String getFilePostfixNameLowerCase(String fileName){
		String postfixName = getFilePostfixName(fileName);
		return postfixName.toLowerCase();
	}

	/**
	 * 获得文件的不带后缀名的名称
	 * 
	 * @param fileName
	 *            文件名称
	 * @return 获得文件的不带后缀名的名称
	 */
	public final static String getFilePreName(String fileName){
		return fileName.substring(0, fileName.lastIndexOf("."));
	}

	/**
	 * 获得带后缀的文件纯名称<br>
	 * 如:F:/pie2.png,return pie2.png
	 * 
	 * @param fileName
	 * @return
	 */
	public final static String getFileName(String fileName){
		File file = new File(fileName);
		return file.getName();
	}

	/**
	 * 判断文件夹是否存在，如果不存在则新建
	 * 
	 * @param chartPath
	 */
	public static void isDirPathExist(String chartPath){
		File file = new File(chartPath);
		if (!file.exists()){
			file.mkdirs();
		}
	}

	/**
	 * 判断文件是否存在
	 * 
	 * @param filePath
	 * @return
	 */
	public final static boolean isExistFile(String filePath){
		File file = new File(filePath);
		return file.exists();
	}

	/**
	 * 判断excel文件是否是2003的版本
	 * 
	 * @param fileName
	 *            文件名称带后缀 或者是路径名称
	 * @return 判断excel文件是否是2003的版本
	 */
	public final static boolean isExcel2003(String fileName){
		return "xls".equalsIgnoreCase(getFilePostfixName(fileName));
	}

	/**
	 * 判断excel文件是否是2007的版本
	 * 
	 * @param fileName
	 *            文件名称带后缀 或者是路径名称
	 * @return 判断excel文件是否是2007的版本
	 */
	public final static boolean isExcel2007(String fileName){
		return "xlsx".equalsIgnoreCase(getFilePostfixName(fileName));
	}

	// ************************************************************************
	//
	// 各种判断
	//
	// ************************************************************************
	/**
	 * 上传的文件是否是常用图片格式
	 * 
	 * @param fileName
	 *            文件名称
	 * @return 上传的文件是否是常用图片格式
	 */
	public final static boolean isCommonImage(String fileName){
		return isInAppointTypes(fileName, IOConstants.commonImages);
	}

	/**
	 * 上传的文件是否在指定的文件类型里面
	 * 
	 * @param fileName
	 *            文件名称
	 * @param appointTypes
	 *            指定的文件类型数组
	 * @return 上传的文件是否在指定的文件类型里面
	 */
	public final static boolean isInAppointTypes(String fileName,String[] appointTypes){
		return ArrayUtil.isContain(appointTypes, getFilePostfixName(fileName));
	}
}
